/********************************************
 * 客户端用户登录：
 * 传入和服务器建立连接的sockFd
 * 登录成功返回1，失败返回0
 ********************************************/

#include "../include/head.h"
#include "../include/login.h"

int clientLogin(int sockFd)
{
    //1、提示用户输入用户名，把用户名发送给服务器，
    //   根据服务器的反馈如果输入了正确的用户名，接收相应的salt
    //   如果输入的是非法用户名，重新输入
    
    char username[20] = {0};
    char flag[2] = {0};
    char salt[9] = {0};         //服务器发来的用户对应的salt值
    char *inputPwd;    //用户输入的密码
    char *chngPwd;     //根据salt转换后的密码
    char sendPwd[128] = {0};
    int sendRet = 0;
    int recvRet = 0;

    printf("please input username: ");
    scanf("%s", username); //输入用户名
    sendRet = sendRet = send(sockFd, username, strlen(username), 0);
    ERROR_CHECK(sendRet, -1, "send username");
    recvRet = recv(sockFd, flag, 1, 0);  //接收服务器的回馈值
    ERROR_CHECK(recvRet, -1, "recv flag");

    while(flag[0] == 'u'){
        //输入正确的用户名
        printf("illegal username!\n");
        memset(username, 0, sizeof(username));
        printf("please input correct username: ");
        scanf("%s", username); //输入用户名
        sendRet = sendRet = send(sockFd, username, strlen(username), 0);
        ERROR_CHECK(sendRet, -1, "send username");
        recvRet = recv(sockFd, flag, 1, 0);  //接收服务器的回馈值
        ERROR_CHECK(recvRet, -1, "recv ret");
    }

    //正确接收salt值
    do{
        memset(salt, 0, sizeof(salt));
        recvRet = recv(sockFd, salt, sizeof(salt), 0);
        ERROR_CHECK(recvRet, -1, "recv");
        /* printf("recvRet = %d\n", recvRet); */
        /* printf("salt = %s\n", salt); */
    }while(recvRet != sizeof(salt));

    //2、输入密码并根据输入的密码以及salt值，生成对应的密文
    //   把生成的密文发送给服务器
    //   如果服务器反馈是正确的的密码，登录成功，返回1
    //   否则重新输入密码
    inputPwd = getpass("please input password: ");
    char buf[20] = {0};
    sprintf(buf, "$6$%s$", salt);
    chngPwd = crypt(inputPwd, buf); //根据salt得到密文
    //截断，只获取密文
    /* printf("chngPwd = %s\n", chngPwd); */
    memcpy(sendPwd, &chngPwd[12], strlen(chngPwd)-12);
    sendRet = send(sockFd, sendPwd, strlen(sendPwd), 0);//把密文发给服务器
    recvRet = recv(sockFd, flag, 1, 0);
    ERROR_CHECK(recvRet, -1, "recv flag");

    while(flag[0] == 'p'){
        //密码错误，重新输入密码
        printf("wrong password!\n");
        inputPwd = getpass("please input correct password: ");
        char buf[20] = {0};
        sprintf(buf, "$6$%s$", salt);
        chngPwd = crypt(inputPwd, buf); //根据salt得到密文
        memset(sendPwd, 0, sizeof(sendPwd));
        memcpy(sendPwd, &chngPwd[12], strlen(chngPwd)-12);
        sendRet = send(sockFd, sendPwd, strlen(sendPwd), 0);//把密文发给服务器
        memset(flag, 0, 2);
        recvRet = recv(sockFd, flag, 1, 0);
        ERROR_CHECK(recvRet, -1, "recv flag");
    }
    if(flag[0] == 'a'){
        printf("login successful!\n");
    }

    return 1;
}

